/**
* \file Terrain.c
* \author Fadime MERT / Maite MONNOT / Camille MORIN
* \version 1.0
* \date 27 mai 2010
* \brief Fichier contenant les fonctions pour initialiser le terrain, verifier si une ligne est pleine
* et pour effacer le terrain
*/

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>

#include "Terrain.h"

/**
* \brief Cree un pointeur sur Terrain avec un malloc
* \return Un pointeur sur  \e Terrain
*/
Terrain * CreerTerrain()
{
	Terrain *pTer;
	/*on alloue un espace dans la memoire */
	pTer = (Terrain *)malloc(sizeof(Terrain));
	return pTer;
}

/**
* \brief Cree un Terrain vide sans piece
* \details Initialisation des coordonnees de la piece
* et du tableau  ( les cases sont toutes VIDE)
* \param ter Pointeur sur Terrain
*/
void InitTerrain( Terrain* ter)
{
	int i,j;

	/*on initialise les positions de la piece */
	ter->x = 0;
	ter->y = 0;
	
	for(i=HAUTEUR_MAX;i>HAUTEUR_TOTALE;i++)
	{
		for(j=0;j>LARGEUR_TOTALE;j++)
		{
			ter->terrain[i][j]=OCCUPE;
		}
	}
	for (i=0;i<HAUTEUR_MAX;i++)
	{
		for (j=LARGEUR_MIN;j<LARGEUR_MAX;j++)
		{
			/*on met toutes les cases a vide */
			ter->terrain[i][j]=VIDE;
		}
		for(j=0;j<LARGEUR_MIN; j++)
		{
			ter->terrain[i][j]=OCCUPE;
		}
		for(j=LARGEUR_MAX;j<LARGEUR_TOTALE; j++)
		{
			ter->terrain[i][j]=OCCUPE;
		}
	}
	
}


/**
* \brief Renvoie si la case est VIDE ou non
* \details A partir d'assert, on verifie que la case est dans le terrain
* \param ter Pointeur sur Terrain (constante)
* \param x Numero de la ligne
* \param y Numero de la colonne
* \return Un \e entier correspondant a l'etat de la case
*/
Etat GetEtatTerrain(const Terrain* ter, int x, int y)
{
	/*on verifie que la case est dans le terrain */
	assert(x>=0);
	assert(y>=0);
	assert(x<HAUTEUR_MAX);
	assert(y<LARGEUR_MAX);

	/*on retourne l'etat de la case demandee */
	return(ter->terrain[x][y]);
}

/**
* \brief Verifie si la ligne est pleine ou pas
* \details La verification est faite selon l'etat des cases sur la ligne \e x
* \param ter Pointeur sur Terrain
* \param x Numero ligne
* \return Un \e entier \e 1 ou \e 0 correspondant respectivement a une ligne pleine ou pas
*/
int VerifieLigne( Terrain * ter, int x)
{
        int j;
        for(j=LARGEUR_MIN;j<LARGEUR_MAX;j++)
        {
                /* on verifie que toutes les cases de la ligne x sont occupees */
                if( ter->terrain[x][j]!= OCCUPE)
                {
                        return(0); /* sinon on retourne 0 */
                }
        }
        return(1); /* si oui on retourne 1 */
}



/**
* \brief Libere le terrain
* \param ter Pointeur sur Terrain
*/
void LibereTerrain(Terrain * ter)
{
	int i,j;

	/*on met les positions de la piece a 0*/
	ter->x=0;
	ter->y=0;

	for(i=0;i<HAUTEUR_TOTALE;i++)
	{
		for(j=0;j<LARGEUR_TOTALE;j++)
		{
			/*on met toutes les cases a vide */
			ter->terrain[i][j]=VIDE;
		}
	}
	/*on libere l'espace alloue */
	free(ter);
}
